import pymysql  #导入pymysql，因为PyMySQL支持python3.x，而MySQLdb不支持python3.x
import config



def singleton(cls,*args,**kwargs): #单列类，没有做线程安全，多线程的时候，对象可能创建多个，所以为不安全，应该加线程锁
    instances={}
    def _singleton():
        if cls not in instances:
            instances[cls]=cls(*args,**kwargs)
        return instances[cls]
    return _singleton

@singleton   #装饰为单列类，在程序运行期间，zjMySQL创建的对象永远只有一个
class zjMySQL():
    host = config.mysql["host"]  #登录主机     直接定义为属性
    user = config.mysql["user"] #用户
    passwd = config.mysql["passwd"]   #密码
    dbName = config.mysql["dbname"]    #数据库的名，新建的数据库名

    def connet(self):   #用于连接数据库
        self.db=pymysql.connect(self.host,self.user,self.passwd,self.dbName)
        self.cursor=self.db.cursor()

    def close(self):    #用于断开连接
        self.cursor.close()
        self.db.close()

    def get_one(self,sql):      #查询一条数据；类型为元组
        res=None            #sql参数为查询mysql语句
        try:
            self.connet()
            self.cursor.execute(sql)        #执行查询
            res=self.cursor.fetchone()      #获取数据
            self.close()            #关闭
        except:
            print("查询失败")

        return res

    def get_all(self,sql):          #获取所有；类型为元组
        res = ()                #sql参数为查询mysql语句
        try:
            self.connet()       #连接数据库
            self.cursor.execute(sql)    #执行查询语句
            res=self.cursor.fetchall()  #接收全部的返回结果行
            self.close()
        except:
            print("查询失败")
        return res

    def get_all_obj(self,sql,tableName,*args): #获取所有；类型为列表
        resList = []        #sql:sql查询语句
        fieldsList=[]
        if(len(args)>0):
            for item in args:       #遍历字典key
                fieldsList.append(item)  #添加kry
        else:
            fieldsSql="select COLUMN_NAME from information_schema.COLUMNS where table_name ='%s'and table_schema = '%s'"%(tableName,self.dbName)
            #column name列名 information sheet： 信息表
            fields=self.get_all(fieldsSql)  #执行语句，获取所有表信息(("id,"),("name",),("age,"))
            for item in fields:     #遍历key
                fieldsList.append(item[0])  #添加

        res=self.get_all(sql)   #获取传参的查询语句的数据，元组类型tuple
        for item in res:
            items= item
            obj = {}
            count = 0
            for x in item:
                obj[fieldsList[count]]=x
                count += 1
            resList.append(obj)
        return  resList

    def insert(self,sql):   #插入
        return self.__edit(sql)
    def update(self,sql):   #修改
        return self.__edit(sql)
    def delete(self,sql):   #删除
        return self.__edit(sql)
    def __edit(self,sql):
        count = 0
        try:
            self.connet()
            count = self.cursor.execute(sql)
            self.db.commit()        #提交
            self.close()
        except:
            print("事务提交失败")
            self.db.rollback()
        return  count